<?php  
/*
Конструирует widgets_arr, вытягивая только включенные виджеты.
Запихивает  widgets_arr в registry, после чего Controller может добавлять туда  input_data для каждого виджета. 

Ячейка widgets_arr: 
          widget
          input_data
          output_html
          
[!] в принципе, не вижу смысла наследовать виджеты от этого класса.   

1) свободный виджет. Widgets/loginWidget.php::LoginWidget class
2) связанный с модулем. Moduls/<modul_name>/widget/<modul_name>Widget.php::<modul_name>Widget class    

имена классов виджетов всегда должны содержать слово Widget

// TODO
Widgets/widgets_to_templates.conf ([_main.tpl:Login;Face;]) - чтобы рендерить только виджеты, связанные с темплейтом

*/ 
 
class Widget /*extends Controller*/  { 

    private $registry;
    
    private $widgets = array();
    private $widgets_arr = array();

    function __construct($registry = false){
       
        $this->registry = $registry;
        
        if($registry === false) $this->registry = Registry::getInstance();
        
        // создать массив виджетов
        $this->preConstructWidgetsArr();
        
        $this->registry -> set('widgets_arr',$this->widgets_arr);
        
    } // --
    
    
    /*
     *  $global_only - обрабатывать только глобальные виджеты
     */
    function constructWidgetsArr($tpl = null, $global_only = true){  
        if(!isset($this->widgets_arr)) return -1;
        if(!is_array($this->widgets_arr)) return -2;
        
        if(is_null($tpl)){ // TODO
        // срендерить все виджеты
        } else {
        // иначе - только привязанные к шаблону
        }
         
        $tmp = null; 
        foreach($this->widgets_arr as $widget){  
            // if($widget['widget']['linked_modul_id'] == '-1')
            if($global_only){ 
              if($widget['widget']['is_global'] == 1){
                $widget_name = $widget['widget']['widgets_name'] . 'Widget';
                $newWidget = new $widget_name($widget['input_data']); 
                $newWidget->setWidgetData($widget['widget']);
                $newWidget->process(); 
                $widget['output_html'] = $newWidget -> html; 
                // $widget['this']  =    $newWidget ;        
                $tmp[] =  $widget;
              }
            } else {  
              $widget_name = $widget['widget']['widgets_name'] . 'Widget';
                $newWidget = new $widget_name($widget['input_data']); 
                $newWidget->setWidgetData($widget['widget']);
                $newWidget->process(); 
                $widget['output_html'] = $newWidget -> html; 
                // $widget['this']  =    $newWidget ;        
                $tmp[] =  $widget;
            }            
        }  
        $this->registry = Registry::getInstance();
        $this->registry -> set('widgets_arr',$tmp);
    } // -- 	 	 
    
    /*
     * Срендерить определенный виджет
     * [!] Рендерятся виджеты только со статусом global = 0
     */
    function renderGivenLocalWidget($widgets_name = null, $widgets_id = null, $input_data = null){
        if( is_null($widgets_name) AND is_null($widgets_id) ) return null;
        
        if( is_null($widgets_name) ){
        // TODO get $widgets_name by id
        }
        
        $widgets_class_name = $widgets_name . 'Widget';
                
        $Widget = new $widgets_class_name($input_data);
        
        $Widget->setWidgetData();
        
        $data = $Widget->getWidgetData();
        $html = '';
        if( !isset($data['is_global']) ) return null;
        
        if( $data['is_global'] != 1) {
          $Widget->setInputData($input_data);
          $Widget->process();
          $html = $Widget -> html; 
        }
        
        unset($data);
        unset($Widget);
        
        return $html; 
    }
    
     
    private function preConstructWidgetsArr(){
        
        
        $this->getWidgets();
        
        if(isset($this->widgets))
        if(is_array($this->widgets)){
            foreach($this->widgets as $widget){
                $tmp['widget'] = $widget;
                $tmp['input_data'] = array();
                $tmp['output_html'] = '';
                $this->widgets_arr[] = $tmp;
            }
        }
        
        return false;
    } // -- 

    private function getWidgets(){
        $q = "SELECT * FROM widgets WHERE enabled = 1 ";
        $r = mysql_query($q);  
        if(!$r) return -1;
        if( mysql_num_rows($r) > 0){
          while($row = mysql_fetch_assoc($r)){
             $this->widgets[] = $row;
          }
        }
    } // --

    function process(){
    
    } // -- 

 
} // -- class